<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>概述</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="pltcl.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="pltcl.html">快退</a></td><td width="60%" align="center" valign="bottom">章38. PL/Tcl - Tcl 过程语言</td><td width="10%" align="right" valign="top"><a href="pltcl.html">快进</a></td><td width="10%" align="right" valign="top"><a href="pltcl-functions.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="PLTCL-OVERVIEW">38.1. 概述</a></h1>
<p>PL/Tcl 提供 C 语言里面函数开发者所拥有的大多数功能，只有一点点限制除外。</p>
<p><span class="emphasis"><i class="EMPHASIS">好</i></span>的限制是，所有东西都是在一个安全的 Tcl 解释器里面运行的。除了一个有限的 Tcl 安全命令集外，只有很少的几个命令可以通过 SPI 访问数据库以及通过 <code class="FUNCTION">elog()</code> 生成错误信息。不像 C 函数那样，Tcl 没有办法访问数据库后端内部或者获得 OS 级的 PostgreSQL 服务器进程的权限。因此，任何非特权的数据库用户都可以被允许使用这种语言。</p>
<p>另外的实现级限制是 Tcl 过程不能用于创建新数据库类型的输入/输出函数。</p>
<p>有时候需要写一些不受安全 Tcl 限制的 Tcl 函数，比如，可能需要一个可以发送邮件的 Tcl 函数。要处理这样的问题，有一个 PL/Tcl 的变种，叫 <tt class="LITERAL">PL/TclU</tt>(不可信的 Tcl)。这个语言和 PL/Tcl 是完全一样的，只不过使用了一个完整的 Tcl 解释器。<span class="emphasis"><i class="EMPHASIS">如果你使用了 PL/TclU ，那么你必须把它安装成一种不可信的过程语言</i></span>，这样只有数据库超级用户可以用它创建函数。PL/TclU 函数的作者必须注意：你写的函数一定不要做任何预算外的事情，因为它能干所有数据库管理员能干的事情。</p>
<p>如果在安装过程的配置步骤中声明了 Tcl 支持，那么 PL/Tcl 和 PL/TclU 的调用处理器是在制作时自动制作并安装到 PostgreSQL 库目录中去的。要在某个特定的数据库中安装 PL/Tcl 和/或 PL/TclU ，那么你可以使用 <tt class="COMMAND">createlang</tt> 程序。比如 <tt class="LITERAL">createlang pltcl <tt class="REPLACEABLE"><i>dbname</i></tt></tt> 或 <tt class="LITERAL">createlang pltclu <tt class="REPLACEABLE"><i>dbname</i></tt></tt> 。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="pltcl.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="pltcl-functions.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">PL/Tcl - Tcl 过程语言</td><td width="34%" align="center" valign="top"><a href="pltcl.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">PL/Tcl 函数和参数</td></tr>
</table>
</div>
</body></html>